"""
固件下载程序配置管理模块
提供系统配置参数和常量定义
"""
from typing import NamedTuple
from dataclasses import dataclass


# XCP协议命令码常量
class XcpCmdCode:
    """XCP协议命令码定义"""
    CONNECT = 0xFF           # 连接命令
    DISCONNECT = 0xFE        # 断开连接命令
    GET_STATUS = 0xFD        # 获取状态命令
    SET_MTA = 0xF6          # 设置内存传输地址命令
    UPLOAD = 0xF5           # 上传命令
    BUILD_CHECKSUM = 0xF3   # 构建校验和命令
    PROGRAM_START = 0xD2    # 开始编程命令
    PROGRAM_CLEAR = 0xD1    # 清除程序命令
    PROGRAM = 0xD0          # 编程命令
    PROGRAM_RESET = 0xCF    # 复位程序命令
    PROGRAM_MAX = 0xC9      # 编程最大命令


# XCP协议响应码
class XcpRspCode:
    """XCP协议响应码定义"""
    OK = 0xFF               # 成功响应
    ERROR = 0xFE           # 错误响应


# XCP协议错误码
class XcpErrCode:
    """XCP协议错误码定义"""
    CMD_BUSY = 0x10        # 命令忙错误
    CMD_UNKNOWN = 0x20     # 未知命令错误
    OUT_OF_RANGE = 0x22    # 参数超出范围错误
    ACCESS_LOCKED = 0x25   # 访问被锁定错误
    SEQUENCE = 0x29        # 序列错误
    GENERIC = 0x31         # 通用错误


@dataclass
class XcpConfig:
    """XCP协议配置参数"""
    timeout_t1: int = 1    # 命令响应超时时间(s)
    timeout_t3: int = 2    # 开始编程超时时间(s)
    timeout_t4: int = 1    # 擦除内存超时时间(s)
    timeout_t5: int = 1    # 编程内存和复位超时时间(s)
    timeout_t6: int = 0.05      # 命令响应超时时间(s)
    timeout_t7: int = 0.002    # 忙等待定时器超时时间(s)
    max_cto_len: int = 8      # 最大CTO数据包长度
    max_dto_len: int = 8      # 最大DTO数据包长度
    connect_mode: int = 0     # 连接模式
    

@dataclass
class CanConfig:
    """CAN通信配置参数"""
    tx_id: int = 0x001        # 发送CAN ID
    rx_id: int = 0x000        # 接收CAN ID
    baudrate: int = 1000000   # 波特率(1Mbps)
    use_extended: bool = False # 是否使用扩展帧
    device_channel: int = 0    # 设备通道号
    

@dataclass
class DownloadConfig:
    """固件下载配置参数"""
    chunk_size: int = 256     # 每次下载的数据块大小
    retry_count: int = 3      # 重试次数
    verify_enable: bool = True # 是否启用校验
    auto_reset: bool = True   # 下载完成后是否自动复位
    

class GlobalConfig:
    """全局配置管理类"""
    def __init__(self):
        self.xcp = XcpConfig()
        self.can = CanConfig()
        self.download = DownloadConfig()
        
    def update_can_config(self, tx_id: int = None, rx_id: int = None, 
                         baudrate: int = None) -> None:
        """更新CAN配置参数"""
        if tx_id is not None:
            self.can.tx_id = tx_id
        if rx_id is not None:
            self.can.rx_id = rx_id
        if baudrate is not None:
            self.can.baudrate = baudrate


# 全局配置实例
g_config = GlobalConfig() 